home *** CD-ROM | disk | FTP | other *** search
Text File | 1996-04-22 | 15.6 KB | 500 lines | [TEXT/MPS ] |
- //-----------------------------------------------------------------------------
- // FWCyPart.cpp
- // Support for FW_OCyberPartExtension. Wraps it so that the developer
- // never needs to deal with SOM. Also implements basic recipes.
- //
- // Copyright (c) 1995 - 1996 by Apple Computer, Inc., all rights reserved.
- //-----------------------------------------------------------------------------
-
- #include "FWFrameW.hpp"
- #include "FWCyPart.h"
- #include "FWEventH.h"
- #include "FWEvent.h"
- #include "FWEventD.h"
- #include "FWPart.h"
- #include "FWFrame.h"
- #include "FWExtMgr.h"
- #include "Cyberdog.h"
- #include <CyberSession.xh>
-
- //-----------------------------------------------------------------------------
- // Since we have a SOM interface, we have to make sure we don't try to
- // throw any C++ exceptions out of here; we need to catch them and convert
- // them into SOM exceptions.
- //-----------------------------------------------------------------------------
-
- static const char FW_kInvalidException[] = "Unknown Exception!";
-
- #define BEGIN_SOM_CALLBACK \
- FW_TRY \
- {
-
- #define END_SOM_CALLBACK \
- } \
- FW_CATCH_BEGIN \
- FW_CATCH_REFERENCE(FW_XException, exception)\
- { \
- FW_SetException(ev, exception);\
- } \
- FW_CATCH_EVERYTHING() \
- { \
- FW_DEBUG_MESSAGE(FW_kInvalidException);\
- FW_SetEvError(ev, kODErrUndefined);\
- } \
- FW_CATCH_END
-
- //-----------------------------------------------------------------------------
- // Glue Functions Prototypes
- // We fill in a struct with pointers to these functions, and pass it to the
- // extension. When it calls them, it passes in a pointer to that struct.
- // We've subclassed the struct, so we just cast it to a pointer
- // to our real C++ classes, and call equivalent virtual methods for
- // each function.
- //-----------------------------------------------------------------------------
- #pragma mark Global Callback Prototypes
-
- void FW_CallbackOpenCyberItem (Environment*, FW_SCyberPartExtensionCallbacks*, CyberItem*, ODPart*, ParameterSet*);
- void FW_CallbackSetCyberItem (Environment*, FW_SCyberPartExtensionCallbacks*, CyberItem*, ParameterSet*);
- ODBoolean FW_CallbackCanShowCyberItem (Environment*, FW_SCyberPartExtensionCallbacks*, CyberItem*);
- void FW_CallbackShowCyberItem (Environment*, FW_SCyberPartExtensionCallbacks*, CyberItem*);
- ODWindow * FW_CallbackGetCyberItemWindow (Environment*, FW_SCyberPartExtensionCallbacks*, CyberItem*);
- ODBoolean FW_CallbackIsCyberItemSelected (Environment*, FW_SCyberPartExtensionCallbacks*, ODFrame*);
- void FW_CallbackAcquireSelectedCyberItems (Environment*, FW_SCyberPartExtensionCallbacks*, ODFrame*, CyberItemList*);
- ODBoolean FW_CallbackIsURLSelected (Environment*, FW_SCyberPartExtensionCallbacks*, ODFrame*);
- void FW_CallbackGetSelectedURL (Environment*, FW_SCyberPartExtensionCallbacks*, ODFrame*, FW_CString& url);
- ODBoolean FW_CallbackHandleCommand (Environment*, FW_SCyberPartExtensionCallbacks*, long, long, ODFrame*, somToken);
-
- //-----------------------------------------------------------------------------
- // FW_CCyberDispatcher intercepts Window Close-Box events.
- //-----------------------------------------------------------------------------
- #pragma mark -
-
- class FW_CCyberDispatcher: public FW_CEventDispatcher {
- public:
- FW_DECLARE_AUTO(FW_CCyberDispatcher)
- FW_CCyberDispatcher (FW_CPart* part, FW_CMenuBar* theMenuBar);
- ~FW_CCyberDispatcher();
- FW_Boolean DispatchWindowEvent (Environment* ev, ODEventData* event, ODFacet* odFacet);
- private:
- FW_CPart* fPart;
- FW_TAcquiredODRefCntObject<CyberPartExtension> fExtension;
- };
-
- FW_DEFINE_AUTO(FW_CCyberDispatcher)
-
- FW_CCyberDispatcher::FW_CCyberDispatcher (FW_CPart* part, FW_CMenuBar* theMenuBar)
- : FW_CEventDispatcher (part, theMenuBar)
- , fPart (part)
- {
- }
-
- FW_CCyberDispatcher::~FW_CCyberDispatcher()
- {
- }
-
- FW_Boolean
- FW_CCyberDispatcher::DispatchWindowEvent (Environment* ev, ODEventData* event, ODFacet* odFacet)
- {
- ODBoolean handled = false;
-
- if (event->what == kODEvtWindow && event->message == inGoAway) {
- FW_CExtensionManager* manager = fPart->GetExtensionManager(ev);
- FW_ASSERT (manager);
- ODExtension* ext = manager->AcquireExtension (ev, kCyberPartExtension, FW_kDontCreateExtension);
- if (ext) {
- CyberPartExtension* cext = (CyberPartExtension*) ext;
- CyberSession* cyberSession = cext->GetCyberSession (ev);
- FW_ASSERT (cyberSession);
- if (cyberSession)
- handled = cyberSession->CloseCyberDraftWindow (ev, fPart->GetODPart(ev));
- }
- }
-
- if (!handled)
- handled = FW_CEventDispatcher::DispatchWindowEvent (ev, event, odFacet);
-
- return handled;
- }
-
- //-----------------------------------------------------------------------------
- // FW_CCyberDogWindowHandler intercepts Command-W events.
- //-----------------------------------------------------------------------------
- #pragma mark -
-
- class FW_CCyberDogWindowHandler: public FW_MEventHandler {
- public:
- // FW_DECLARE_CLASS
- FW_DECLARE_AUTO(FW_CCyberDogWindowHandler)
- FW_CCyberDogWindowHandler (CyberPartExtension* cyberdog, ODPart* part);
- ~FW_CCyberDogWindowHandler ();
- FW_Boolean DoWindowEvent (Environment* ev, const FW_CMacWindowEvent& event);
- FW_Boolean DoMenu (Environment* ev, const FW_CMenuEvent& event);
- private:
- FW_TAcquiredODRefCntObject<CyberPartExtension> fExtension;
- ODPart* fPart;
- };
-
- //FW_DEFINE_CLASS_M1(FW_CCyberDogWindowHandler, FW_MEventHandler)
- FW_DEFINE_AUTO(FW_CCyberDogWindowHandler)
-
- FW_CCyberDogWindowHandler::FW_CCyberDogWindowHandler (CyberPartExtension* cyberdog, ODPart* part)
- //: FW_MEventHandler (somGetGlobalEnvironment(), 0, parent, TRUE, 0)
- : fExtension (cyberdog)
- , fPart (part)
- {
- }
-
- FW_CCyberDogWindowHandler::~FW_CCyberDogWindowHandler ()
- {
- }
-
- FW_Boolean FW_CCyberDogWindowHandler::DoWindowEvent (Environment* ev, const FW_CMacWindowEvent& event)
- {
- ODBoolean handled = FALSE;
- if (event.GetMessage() == inGoAway) {
- /* FW_CWindow* window = frame->GetWindow(ev);*/
- /*if (!window->IsFloating())*/ {
- // Only do Cyberdog stuff if we still have the extension?
- // XXX
- CyberSession* cyberSession = fExtension->GetCyberSession(ev);
- handled = cyberSession->CloseCyberDraftWindow(ev, fPart);
- }
- }
-
- return handled;
- }
-
- FW_Boolean FW_CCyberDogWindowHandler::DoMenu (Environment* ev, const FW_CMenuEvent& event)
- {
- ODBoolean handled = FALSE;
- if (event.GetCommandID(ev) == kODCommandClose) {
- /* FW_CWindow* window = frame->GetWindow(ev);*/
- /*if (!window->IsFloating())*/ {
- CyberSession* cyberSession = fExtension->GetCyberSession(ev);
- handled = cyberSession->CloseCyberDraftWindow(ev, fPart);
- }
- }
-
- return handled;
- }
-
- #pragma mark -
- //-----------------------------------------------------------------------------
- // Wrapper Class Definition
- //-----------------------------------------------------------------------------
-
- FW_MCyberPart::FW_MCyberPart (FW_CPart* part)
- : fPart (part)
- , fExtension (NULL)
- {
- #if !FW_CyberUseUPPsFlag
- openCyberItem = &FW_CallbackOpenCyberItem;
- setCyberItem = &FW_CallbackSetCyberItem;
- canShowCyberItem = &FW_CallbackCanShowCyberItem;
- showCyberItem = &FW_CallbackShowCyberItem;
- getCyberItemWindow = &FW_CallbackGetCyberItemWindow;
- isCyberItemSelected = &FW_CallbackIsCyberItemSelected;
- acquireSelectedCyberItems = &FW_CallbackAcquireSelectedCyberItems;
- isURLSelected = &FW_CallbackIsURLSelected;
- getSelectedURL = &FW_CallbackGetSelectedURL;
- handleCommand = &FW_CallbackHandleCommand;
- #else
- # error obsolete
- #endif
- }
-
- FW_MCyberPart::~FW_MCyberPart ()
- {
- // if (fExtension) {
- // If the C++ object gets deleted, remove it from the SOM object
- // However we don't call Release on it; it is still owned by the Part.
- // ODF_FW_OCyberPartExtension* extension = fExtension;
- // fExtension = nil;
- // extension->SetCallbacks (somGetGlobalEnvironment(), NULL);
- // }
- }
-
- void FW_MCyberPart::Initialize (Environment* ev)
- {
- // I need to regster with the extension manager but at part construction time it
- // doesn't exist yet. I can't just create it because the "normal" creation method
- // will not check. Delayed initialization is forced.
- FW_CExtensionManager* manager = fPart->GetExtensionManager(ev);
- FW_ASSERT (manager);
- manager->RegisterExtension (ev, kCyberPartExtension, &CreateCyberExtension, this, FALSE);
- }
-
- CyberItem*
- FW_MCyberPart::GetCyberItem ()
- {
- if (fExtension != nil)
- return fExtension->GetCyberItem (somGetGlobalEnvironment());
- else
- return nil;
- }
-
- CyberSession*
- FW_MCyberPart::GetCyberSession ()
- {
- Environment* ev = somGetGlobalEnvironment();
-
- if (fExtension != nil)
- return fExtension->GetCyberSession (ev);
- else {
- // Create our extension, which will create the CyberSession
- FW_TAcquiredODRefCntObject<CyberExtension> extension = (CyberExtension*) fPart->GetExtensionManager(ev)->AcquireExtension (ev, kCyberPartExtension, FW_kCreateExtension);
- return extension->GetCyberSession (ev);
- }
- }
-
- CyberPartExtension*
- FW_MCyberPart::AcquireCyberExtension()
- {
- Environment* ev = somGetGlobalEnvironment();
- if (fExtension != nil) {
- fExtension->Acquire (ev);
- return fExtension;
- }
- else
- return (CyberPartExtension*) fPart->GetExtensionManager(ev)->AcquireExtension (ev, kCyberPartExtension, FW_kCreateExtension);
- }
-
- FW_CEventDispatcher* FW_MCyberPart::MakeEventDispatcher (Environment *ev)
- {
- return FW_NEW (FW_CCyberDispatcher, (fPart, fPart->GetMenuBar(ev)));
- }
-
- /*
- Behavior Delegated from CyberPartExtension
- */
-
- void FW_MCyberPart::HandleOpenCyberItem (Environment* ev, CyberItem* item, ODPart* openerPart, ParameterSet* parameters)
- {
- // By default call the default ("inherited") OpenCyberItem in CyberPartExtension.
- fExtension->DefaultOpenCyberItem (ev, item, openerPart, parameters);
- }
-
- void FW_MCyberPart::DoSetCyberItem (Environment* ev, CyberItem* newItem, ParameterSet* parameters)
- {
- FW_UNUSED (ev);
- FW_UNUSED (newItem);
- FW_UNUSED (parameters);
-
- // Should be customized by Developer
- // Must call inherited (done in extension)
- }
-
- ODBoolean FW_MCyberPart::DoCanShowCyberItem (Environment* ev, CyberItem* item)
- {
- FW_UNUSED (ev);
- FW_UNUSED (item);
-
- // This is a test for equality (not identity). If you are showing
- // some variant of the given item, return true. For example,
- // http://Where/ is similar to http://Where/index.html
- // Also, http://Here#Bookmark is similar to http://Here
-
- // You don't need to test for identity; it's handled by the FW
- // SOM extension for you.
-
- return FALSE;
- }
-
- void FW_MCyberPart::DoShowCyberItem (Environment* ev, CyberItem* item)
- {
- FW_UNUSED (ev);
- FW_UNUSED (item);
- }
-
- ODWindow* FW_MCyberPart::DoGetCyberItemWindow (Environment* ev, CyberItem* item)
- {
- FW_UNUSED (item);
-
- // I think this API is a Cyberdog bug: it is not acquiring the window!
- // This is not properly thread-safe.
-
- FW_CFrame* active = fPart->GetLastActiveFrame (ev);
- if (active) {
- FW_TAcquiredODRefCntObject<ODWindow> theWindow = active->AcquireODWindow (ev);
- return theWindow;
- }
-
- return kODNULL;
- }
-
- ODBoolean FW_MCyberPart::DoIsCyberItemSelected (Environment* ev, ODFrame* frame)
- {
- FW_UNUSED (ev);
- FW_UNUSED (frame);
-
- return FALSE;
- }
-
- void FW_MCyberPart::DoAcquireSelectedCyberItems (Environment* ev, ODFrame* frame, CyberItemList* items)
- {
- FW_UNUSED (ev);
- FW_UNUSED (frame);
- FW_UNUSED (items);
- }
-
- ODBoolean FW_MCyberPart::DoIsURLSelected (Environment* ev, ODFrame* frame)
- {
- FW_UNUSED (ev);
- FW_UNUSED (frame);
-
- return FALSE;
- }
-
- void FW_MCyberPart::DoGetSelectedURL (Environment* ev, ODFrame* frame, FW_CString & url)
- {
- FW_UNUSED (ev);
- FW_UNUSED (frame);
-
- url = "";
- }
-
- ODBoolean FW_MCyberPart::HandleCyberCommand (Environment* ev, long commandSuite, long command, ODFrame* frame, somToken parameters)
- {
- // By default call the default ("inherited") HandleCommand in CyberPartExtension.
- return fExtension->DefaultHandleCommand (ev, commandSuite, command, frame, parameters);
- }
-
- ODExtension* FW_MCyberPart::CreateCyberExtension (Environment* ev, FW_CPart *part, const char* const name, void* selfAPI)
- {
- FW_UNUSED (name);
-
- FW_MCyberPart* self = (FW_MCyberPart*) selfAPI;
-
- ODPart* odpart = part->GetODPart(ev);
- ODF_FW_OCyberPartExtension* cyberPartExtension = new ODF_FW_OCyberPartExtension;
- cyberPartExtension->ICyberPartExtension (ev, odpart);
- cyberPartExtension->SetCallbacks (ev, self);
-
- cyberPartExtension->Acquire(ev);
- self->fExtension = cyberPartExtension;
-
- // CyberDog hackism support. See FW_CCyberDogWindowHandler above.
- cyberPartExtension->Acquire(ev);
- FW_CCyberDogWindowHandler* eventHacker = FW_NEW (FW_CCyberDogWindowHandler, (cyberPartExtension, odpart));
- part->AdoptEventHandler (ev, eventHacker);
-
- return cyberPartExtension;
- }
-
- #pragma mark -
- //-----------------------------------------------------------------------------
- // Glue Functions Definition
- //-----------------------------------------------------------------------------
-
- // Should I use RTTI here? Hardly seems necessary.
- #define FINDSELF(SELF,CALLBACKS) FW_MCyberPart* SELF = (FW_MCyberPart*) CALLBACKS
-
- void FW_CallbackOpenCyberItem (Environment* ev, FW_SCyberPartExtensionCallbacks* callbacks, CyberItem* item, ODPart* openerPart, ParameterSet* data)
- {
- BEGIN_SOM_CALLBACK
- FINDSELF(self,callbacks);
- self->HandleOpenCyberItem (ev, item, openerPart, data);
- END_SOM_CALLBACK
- }
-
- void FW_CallbackSetCyberItem (Environment* ev, FW_SCyberPartExtensionCallbacks* callbacks, CyberItem* item, ParameterSet* data)
- {
- BEGIN_SOM_CALLBACK
- FINDSELF(self,callbacks);
- self->DoSetCyberItem (ev, item, data);
- END_SOM_CALLBACK
- }
-
- ODBoolean FW_CallbackCanShowCyberItem (Environment* ev, FW_SCyberPartExtensionCallbacks* callbacks, CyberItem* item)
- {
- ODBoolean similar = false;
- BEGIN_SOM_CALLBACK
- FINDSELF(self,callbacks);
- similar = self->DoCanShowCyberItem (ev, item);
- END_SOM_CALLBACK
-
- return similar;
- }
-
- void FW_CallbackShowCyberItem (Environment* ev, FW_SCyberPartExtensionCallbacks* callbacks, CyberItem* item)
- {
- BEGIN_SOM_CALLBACK
- FINDSELF(self,callbacks);
- self->DoShowCyberItem (ev, item);
- END_SOM_CALLBACK
- }
-
- ODWindow* FW_CallbackGetCyberItemWindow (Environment* ev, FW_SCyberPartExtensionCallbacks* callbacks, CyberItem* item)
- {
- BEGIN_SOM_CALLBACK
- FINDSELF(self,callbacks);
- return self->DoGetCyberItemWindow (ev, item);
- END_SOM_CALLBACK
-
- return NULL;
- }
-
- ODBoolean FW_CallbackIsCyberItemSelected (Environment* ev, FW_SCyberPartExtensionCallbacks* callbacks, ODFrame* frame)
- {
- ODBoolean selected = false;
-
- BEGIN_SOM_CALLBACK
- FINDSELF(self,callbacks);
- selected = self->DoIsCyberItemSelected (ev, frame);
- END_SOM_CALLBACK
-
- return selected;
- }
-
- void FW_CallbackAcquireSelectedCyberItems (Environment* ev, FW_SCyberPartExtensionCallbacks* callbacks, ODFrame* frame, CyberItemList* list)
- {
- BEGIN_SOM_CALLBACK
- FINDSELF(self,callbacks);
- self->DoAcquireSelectedCyberItems (ev, frame, list);
- END_SOM_CALLBACK
- }
-
- ODBoolean FW_CallbackIsURLSelected (Environment* ev, FW_SCyberPartExtensionCallbacks* callbacks, ODFrame* frame)
- {
- ODBoolean selected = false;
-
- BEGIN_SOM_CALLBACK
- FINDSELF(self,callbacks);
- selected = self->DoIsURLSelected (ev, frame);
- END_SOM_CALLBACK
-
- return selected;
- }
-
- void FW_CallbackGetSelectedURL (Environment* ev, FW_SCyberPartExtensionCallbacks* callbacks, ODFrame* frame, FW_CString& url)
- {
- BEGIN_SOM_CALLBACK
- FINDSELF(self,callbacks);
- self->DoGetSelectedURL (ev, frame, url);
- #if 0
- // all this has been moved into SLCyPart.cpp
- int length = url.GetByteLength();
- if (length == 0)
- return NULL;
- corbastring curl = (corbastring) SOMMalloc (length + 1);
- if (!curl)
- FW_Failure(FW_xMemoryExhausted);
- strcpy (curl, url);
- return curl;
- #endif
- END_SOM_CALLBACK
- }
-
- ODBoolean FW_CallbackHandleCommand (Environment* ev, FW_SCyberPartExtensionCallbacks* callbacks, long commandSuite, long command, ODFrame* frame, somToken parameters)
- {
- ODBoolean handled = false;
-
- BEGIN_SOM_CALLBACK
- FINDSELF(self,callbacks);
- handled = self->HandleCyberCommand (ev, commandSuite, command, frame, parameters);
- END_SOM_CALLBACK
-
- return handled;
- }
-
-